perm filename HHT.FAI[CMS,LCS]2 blob sn#424700 filedate 1979-03-10 generic text, type T, neo UTF8
00100	; LOAD THIS FILE AND SAVE AS  "HHT.DMP"
00200	; THEN EX CON11.FAI[CMS,LCS] TO CONVERT TO PDP-11 LOADER FORMAT
00300	; FINAL FILE IS "LOAD11.HHT"
00400	
00500	;		BIT RATE GEN CODES
00600	;	0 = 0			10 = 9600
00700	;	1 = 19.2K		11 = 4800
00800	;	2 = 50			12 = 1800
00900	;	3 = 75			13 = 1200
01000	;	4 = 134.5		14 = 2400
01100	;	5 = 200			15 = 300
01200	;	6 = 600			16 = 150
01300	;	7 = 2400		17 = 110
01400	
01500		TITLE HHT
01600		.INSERT	ASMBL.FAI[CMS,LCS]
01700	
01800		CPL ← = 28	;CHRS PER LINE
01900		NCHRS ← = 112	;CHRS PER SCREEN
02000		
02100	; Zpage ram
02200	   LOC 0
02300		COL:	0
02400		CUR:	0
02500			0
02600		WINDOW:	0
02700			0
02800	
02900		TMP:	0
03000			0
03100		LINL:	0
03200		CHRL:	0
03300		BRT:	0
03400	
03500		NWAIT:	0
03600		UPFLG:	0
03700		CURVIS:	0
03800		DIS:	0
03900			0
04000		SHIFT:	0
04100		WINK:	0
04200	
04300		SHFT:	0	;Keyboard shift flag.
04400		OFFL:	0	;Off delay count low.
04500	
04600		LOC 600
04700	REBUF0:	BLOCK = 128	;REFRESH BUFFER
04800	;	LOC 1000
04900	REBUF1:	BLOCK = 128
05000	;	LOC 1200
05100	REBUF2:	BLOCK = 128
05200	;	LOC 1400
05300	REBUF3:	BLOCK = 128
05400	;	LOC 1600
05500	REBUF4:	BLOCK = 128
05600		BLOCK = 1024
05700	
05800		LOC 4000
05900	ABUF:	0		;ASCII CHR BUF
     

00100	; Reset
00200		LOC 174000	;LOC 174000
00300		RSTA:	LDAI	377	;TURN OFF COLS
00400			STA	COLREG
00500			CLD		;CLEAR DECIMAL MODE
00600			LDXI	177	;STACK DEPTH
00700			TXS		;SETUP STACK
00800			LDAI	0	;SET UP BRIGHTNESS
00900			STAZ	BRT
01000	
01100	; SETUP AND CLEAR SCREEN
01200		;CLEAR ABUF, SETUP CURSOR AND WINDOW
01300		SD ← 10		;START OF ABUF
01400		ED ← 14		;END OF ABUF
01500			JSR	HOME	;SETUP CURSOR
01600			LDAI	=16	;NUMBER OF LINES IN MEM
01700			STAZ	TMP
01800		CLRM:	JSR	LF	;<lf> THEN CLEAR LINE *16
01900			DECZ	TMP
02000			BNE	CLRM
02100	; INIT I/O
02200	  ;INIT RS232
02300		SIODEF ← 225	;UART CONTROL WORD
02400		ACIAC ← 77776	;UART CONTROL REG ADDRESS
02500		ACIAD ← 77777	;UART DATA REG ADDRESS
02600			LDAI	3	;RESET ACIA
02700			STA	ACIAC
02800			LDAI	SIODEF	;SETUP DEFAULT I/O CONTROL
02900			STA	ACIAC
03000	  ;INIT KB SCANER
03100		KBD ← 23776	;KEYBOARD DATA REGISTER ADDRESS
03200		KBC ← 23777	;KEYBOARD CONTROL REGISTER ADDRESS
03300			LDAI	2	;KB DPY MODE SET
03400			STA	KBC
03500			LDAI	60	;KB CLK DIV
03600			STA	KBC
03700	
03800			LDAI	302	;CLEAR KB INTERUPT
03900			STA	KBC
04000	
04100			LDAI	100	;READ KB
04200			STA	KBC
04300			LDXI	377
04400			STXZ	OFFL	;Setup off delay.
04500			INX
04600			STXZ	SHFT	;Reset shift flag.
04700	
04800			CLI		;ENABLE INTERRUPTS
     

00100	; REFRESH LOOP
00200		NCHRS ← =112	;NUMBER OF CHRS ON SCREEN
00300		DPYSR ← 27777	;DISPLAY SHIFT REGISTER ADDRESS
00400	
00500			LDXI	NCHRS-1
00600		RELOOP:	LDAI	376
00700			STAZ	COL	;SETUP COL BIT 1
00800					;				       CY
00900		SLOOP0:	LDAX	REBUF0	;PUT FIRST COL IN SHIFT			4
01000			STA	DPYSR	;REGISTER STARTING WITH LAST CHR	4
01100			DEX		;					2
01200			BPL	SLOOP0	;				       _3_
01300			JSR	NXCOL	;TURN ON COL AND WAIT		    5+(13*112)=1461
01400	
01500		SLOOP1:	LDAX	REBUF1	;SECOND
01600			STA	DPYSR
01700			DEX
01800			BPL	SLOOP1
01900			JSR	NXCOL
02000	
02100		SLOOP2:	LDAX	REBUF2	;THIRD
02200			STA	DPYSR
02300			DEX
02400			BPL	SLOOP2
02500			JSR	NXCOL
02600	
02700		SLOOP3:	LDAX	REBUF3	;FORTH
02800			STA	DPYSR
02900			DEX
03000			BPL	SLOOP3
03100			JSR	NXCOL
03200	
03300		SLOOP4:	LDAX	REBUF4	;FIFTH
03400			STA	DPYSR
03500			DEX
03600			BPL	SLOOP4
03700			JSR	NXCOL
03800	
03900			JMP	RELOOP
     

00100	; WAIT LOOP AND SETUP
00200		COLREG ← 33777	;COL ENABLE REGISTER ADDRESS
00300		SPEED ← = 36	;SPEED OF SHIFT RIGHT IN ms * 2
00400	; TURN ON COL					       CY
00500		NXCOL:	LDAZ	COL	;			3
00600			STA	COLREG	;TURN ON COL		4
00700			SEC		;			2
00800			ROLZ	COL	;SHIFT FOR NEXT COL	5
00900	
01000	; WAIT(BRIGHTNESS)		Tcy = 1488 = .9916 ms
01100			LDXZ	BRT	;			3
01200			LDAX	BTBL	;			4
01300			STAZ	NWAIT	;			4
01400		WAIT1:	DECZ	NWAIT	;			5
01500			BNE	WAIT1	;			3
01600	
01700			INCZ	WINK	;			5
01800			BEQ	BLINK	;TIME TO BLINK		2
01900		GOWAIT:	LDAX	OFFTBL	;			4
02000			STAZ	NWAIT	;SETUP OFF WAIT		4
02100			LDXI	NCHRS-1	;			2
02200	; TURN OFF COL
02300			LDAI	377	;			2
02400			STA	COLREG	;TURN OFF COL		4
02500			LDAZ	UPFLG	;CK IF UPDATE FLAG SET	3
02600			BNE	CKSHFT	;			2
02700	
02800	; WAIT(¬BRIGHTNESS)
02900		WAIT2:	DECZ	NWAIT	;			5
03000			BNE	WAIT2	;			3
03100	
03200			RTS		;			6
03300	; BRIGHTNESS TABLES
03400		BTBL:	=80  ↔ =200
03500		OFFTBL:	=120 ↔ 1
03600	; BLINK CURSOR
03700		BLINK:	DECZ	OFFL	;Off delay.
03800			BNE	SWTCH
03900			LDAI	377
04000			STA	COLREG	;Turn off display.
04100		OFF:	BITZ	OFFL	;Wait until KB or RS232.
04200			BPL	OFF
04300	
04400		SWTCH:	JSR	SHOCUR	;XOR CURSOR INTO REBUF
04500			JMP	GOWAIT
04600	; CHECK FOR RIGHT SHIFT
04700		CKSHFT:	BPL	UPDATE	;CK RIGHT SHIFT FLAG
04800			DECZ	SHIFT	;SEE IF TIME TO SHIFT
04900			BNE	WAIT2	;CK UPDATE?
05000			LDAI	SPEED
05100			STAZ	SHIFT
05200			SEI		;MASK OUT INTERRUPTS
05300			LDYZ	WINDOW
05400			INY
05500			TYA
05600			ANDI	77
05700			CMPI	45	;CHECK IF AT LEFT EDGE
05800			BCS	EDGE
05900			STYZ	WINDOW
06000			JSR	CKVIS	;SETUP Y INDEX AND DISTANCE
06100			CLI		;ENABLE INTERUPTS
06200			JMP	UPDPY
06300	
06400		EDGE:	LDAZ	UPFLG
06500			ANDI	177	;TURN OFF RIGHT SHIFT FLAG
06600			STAZ	UPFLG
06700			CLI		;ENABLE INTERRUPTS
06800			BEQ	WAIT2	;FALL THROUGH TO UPDATE
     

00100	; UPDATE SCREEN
00200		UPDATE:	LDAI	0	;RESET UDATE FLAG
00300			STAZ	UPFLG
00400		UPDPY:	LDAZ	WINDOW	;COPY WINDOW INTO TEMP
00500			STAZ	TMP
00600			LDAZ	WINDOW+1
00700			STAZ	TMP+1
00800			LDAI	4	;NUMBER OF LINES PER SCREEN
00900			STAZ	LINL
01000			LDYI	0
01100	
01200		LLOOP:	LDAI	CPL	;28 CHRS TO GO
01300			STAZ	CHRL
01400	
01500		ULOOP:	LDXI	0
01600			LDAIX	TMP	;WRITE CHRGEN BITS INTO REBUF
01700			JSR	WCHR
01800			INY
01900			INCZ	TMP
02000			BNE	CKCHRL
02100			INCZ	TMP+1
02200			LDAZ	TMP+1
02300			CMPI	ED
02400			BNE	CKCHRL
02500			LDAI	SD
02600			STAZ	TMP+1
02700	
02800		CKCHRL:	DECZ	CHRL
02900			BNE	ULOOP	;MORE CHRS LEFT ON LINE
03000	
03100			LDAZ	TMP
03200			CLC
03300			ADCI	44	;100-CPL = NEXT LINE
03400			STAZ	TMP
03500			BCC	NOOF
03600			INCZ	TMP+1
03700			LDAZ	TMP+1
03800			CMPI	ED
03900			BNE	NOOF
04000			LDAI	SD
04100			STAZ	TMP+1
04200	
04300		NOOF:	DECZ	LINL
04400			BNE	LLOOP	;DO NEXT LINE
04500	
04600			JSR	SHOCUR	;SHOW CURSOR IF ON SCREEN
04700			LDXI	NCHRS-1	;SETUP X
04800			RTS
     

00100	; KB INTERRUPT ROUTINE
00200		KBINT:	PHA		;SAVE REGS
00300			TXA
00400			PHA
00500	
00600			LDX	KBD	;GET CHR FROM KB
00700	
00800			LDAI	302	;CLEAR KB INTERUPT
00900			STA	KBC
01000	
01100			CPXI	300	;Shift key index.
01200			BNE	SHFTCK
01300			STXZ	SHFT	;Set shift flag.
01400			BEQ	KBRTRN	;Jump.
01500		SHFTCK:	BITZ	SHFT	;Ck if last key = shift
01600			BPL	CLRIT
01700			TXA
01800			ANDI	277	;And out 100 bit.
01900			TAX
02000			LDAI	0	;Reset shift flag.
02100			STAZ	SHFT
02200		CLRIT:	CLI		;CLEAR INTERUPT MASK
02300	
02400		OWAIT:	LDA	ACIAC
02500			ANDI	2	;CHECK IF FULL
02600			BEQ	OWAIT
02700			LDAX	CHRTBL	;CONVERT KB TO ASCCI
02800			STA	ACIAD	;OUTPUT IT
02900	
03000		KBRTRN:	LDAI	377
03100			STAZ	OFFL	;Reset off delay count.
03200	
03300			PLA		;RESTORE REGS
03400			TAX
03500			PLA
03600			RTI		;RETURN
03700	;ERASE CURSOR
03800		CKERA:	LDYZ	CURVIS
03900			BMI	NOS	;CK IF ON SCREEN
04000			LDXI	0
04100			LDAIX	CUR
04200	; GEN CHR
04300		WCHR:	TAX		;X ← ASCII CHR
04400			LDAX	CGEN0	;FILL REBUF COLS 0-4
04500			STAY	REBUF0
04600			LDAX	CGEN1
04700			STAY	REBUF1
04800			LDAX	CGEN2
04900			STAY	REBUF2
05000			LDAX	CGEN3
05100			STAY	REBUF3
05200			LDAX	CGEN4
05300			STAY	REBUF4
05400		NOS:	RTS
05500	; <bspace>
05600		BS:	JSR	CKERA	;ERASE OLD CURSOR IF ON SCREEN
05700			LDAZ	CUR	;DECREMENT CURSOR
05800			BNE	NOBACK
05900			DECZ	CUR+1
06000			LDAZ	CUR+1
06100			CMPI	SD-1	;CK IF BEFORE BEGINING
06200			BNE	NOBACK
06300			LDAI	ED-1	;WRAP AROUND
06400			STAZ	CUR+1
06500		NOBACK:	DECZ	CUR
06600			JMP	CKCUR	;SHOW CURSOR IF ON SCREEN
06700	; CURSOR OFF LINE
06800		OFFLIN:	DECZ	CUR	;FIX CUR FOR <cr>
06900			JSR	CR	;<cr>
07000			JMP	RLF	;<lf>, CK SCROLL AND UPDATE
     

00100	; RS232 INTERRUPT ROUTINE
00200		RSINT:	PHA		;SAVE REGS
00300			TXA
00400			PHA
00500			TYA
00600			PHA
00700	
00800			LDA	ACIAD	;GET CHR FROM ACIA
00900			ANDI	177	;7 BITS
01000			BEQ	RSRTRN	;Check for nulls.
01100	
01200			CMPI	10	;<Backspace>.
01300			BEQ	BS
01400			CMPI	30	;Control codes.
01500			BCC	SCNTRL
01600	
01700		PCHR:	LDXI	0
01800			STAIX	CUR	;STORE IN ABUF
01900			LDYZ	CURVIS	;CK IF IN WINDOW
02000			BMI	INCUR
02100			JSR	WCHR	;WRITE CHR IN REBUF
02200	
02300		INCUR:	INCZ	CUR	;INCREMENT CURSOR
02400			LDAZ	CUR
02500			ANDI	77
02600			BEQ	OFFLIN	;BRANCH IF OFF END OF LINE
02700	
02800		CKCUR:	JSR	CKVIS	;SHOW CURSOR IF ON SCREEN
02900	
03000			JSR	SHOCUR	;XOR CURSOR INTO REBUF
03100	
03200		RSRTRN:	LDAI	377
03300			STAZ	OFFL	;Reset off delay count.
03400	
03500			PLA		;RESTORE REGS
03600			TAY
03700			PLA
03800			TAX
03900			PLA
04000			RTI		;RETURN
     

00100	; FOLLOW CURSOR
00200		FOLLOW:	LDXZ	WINDOW
00300			LDYZ	WINDOW+1
00400			LDAZ	CUR
00500			ANDI	300	;SET CURSOR AT BOTTOM RIGHT OF WINDOW
00600			SEC
00700			SBCI	300
00800			STAZ	WINDOW
00900			LDAZ	CUR+1
01000			SBCI	0
01100			CMPI	SD-1
01200			BNE	NOTB4
01300			LDAI	ED-1
01400		NOTB4:	STAZ	WINDOW+1
01500	
01600			LDAZ	CUR	;SET CURSOR AT RIGHT
01700			ANDI	77
01800			CMPI	CPL
01900			BCC	OK
02000			SBCI	CPL-1
02100			ORAZ	WINDOW
02200			STAZ	WINDOW
02300	
02400		OK:	CPXZ	WINDOW	;UPDATE SCREEN IF DIFFERENT
02500			BNE	SETFLG
02600			CPYZ	WINDOW+1
02700			BNE	SETFLG
02800			BEQ	RSRTRN
02900	
03000	;Oldest text.
03100		OLDEST:	LDAZ	CUR
03200			ANDI	300
03300			CLC
03400			ADCI	100	;Next line.
03500			STAZ	WINDOW
03600			LDAZ	CUR+1
03700			ADCI	0
03800			CMPI	ED
03900			BNE	NOPASS
04000			LDAI	SD
04100		NOPASS:	STAZ	WINDOW+1
04200			BNE	SETFLG	;JUMP.
     

00100	; RS232 CONTROL
00200		SCNTRL:	CMPI	26	;CUR ← RIGHT BOTTOM
00300			BEQ	FOLLOW
00400			CMPI	12	;<lf>
00500			BEQ	RLF
00600			CMPI	15	;<cr>
00700			BEQ	RCR
00800			CMPI	13	;SCROLL UP
00900			BEQ	SCRLU
01000			CMPI	14	;SCROLL DOWN
01100			BEQ	SCRLD
01200			CMPI	22	;TOGGLE BRIGHTNESS
01300			BEQ	BRIGHT
01400			CMPI	20	;RIGHT
01500			BEQ	RIGHT
01600			CMPI	21	;SET AT LEFT
01700			BEQ	LEFT
01800			CMPI	7	;ERROR
01900			BEQ	JRTRN
02000			CMPI	27	;Oldest.
02100			BEQ	OLDEST
02200			JMP	PCHR	;PRINT IT ANYWAY
02300	; <lf>
02400		RLF:	JSR	LF	;<lf>
02500			JMP	SETFLG	;UPDATE SCREEN
02600	; <cr>
02700		RCR:	JSR	CKERA	;ERASE OLD CURSOR
02800			JSR	CR
02900			JMP	CKCUR	;SHOW CURSOR IF ON SCREEN
03000	; SCROLL DOWN
03100		SCRLD:	LDAZ	WINDOW
03200			CLC
03300			ADCI	100	;FOR 64 CHRS
03400			STAZ	WINDOW
03500			BCC	SETFLG
03600			INCZ	WINDOW+1
03700			LDAZ	WINDOW+1
03800			CMPI	ED
03900			BNE	SETFLG
04000			LDAI	SD
04100			STAZ	WINDOW+1
04200		SETFLG:	JSR	CKVIS
04300			INCZ	UPFLG	;UPDATE SCREEN
04400		JRTRN:	JMP	RSRTRN	;SET UPDATE FLAG
     

00100	; SCROLL UP
00200		SCRLU:	LDAZ	WINDOW
00300			SEC
00400			SBCI	100	;64 CHRS PER LINE
00500			STAZ	WINDOW
00600			BCS	SETFLG
00700			DECZ	WINDOW+1
00800			LDAZ	WINDOW+1
00900			CMPI	SD-1
01000			BNE	SETFLG
01100			LDAI	ED-1
01200			STAZ	WINDOW+1
01300			JMP	SETFLG
01400	; BRIGHTNESS
01500		BRIGHT:	LDAZ	BRT
01600			ANDI	1
01700			EORI	1	;TOGGLE
01800			STAZ	BRT
01900			JMP	RSRTRN
02000	; SET WINDOW AT LEFT OF PAGE
02100		LEFT:	LDAZ	WINDOW
02200			ANDI	300
02300			STAZ	WINDOW
02400			LDAI	1	;1 FOR NO RIGHT SHIFT AND UPDATE SCREEN
02500			STAZ	UPFLG
02600			JMP	SETFLG
02700	; WINDOW RIGHT
02800		RIGHT:	LDAZ	UPFLG
02900			EORI	200	;TOGGLE RIGHT SHIFT BIT
03000			STAZ	UPFLG
03100			LDAI	SPEED
03200			STAZ	SHIFT
03300			JMP	RSRTRN
     

00100	; CK IF IN WINDOW
00200		CKVIS:	LDYI	377	;SET NO SHOW
00300			LDAZ	CUR	;GET DISTANCE
00400			SEC
00500			SBCZ	WINDOW
00600			STAZ	DIS
00700			LDAZ	CUR+1
00800			SBCZ	WINDOW+1
00900			BCS	CKEQ
01000			ADCI	4	;IF NEG, ADD BUF LEN
01100		CKEQ:	STAZ	DIS+1
01200			BNE	NOTVIS	;NO SHOW IF ≥ 256
01300			LDAZ	DIS
01400			ANDI	77
01500			CMPI	CPL	;NO SHOW IF ≥ 28
01600			BCS	NOTVIS
01700			STAZ	CURVIS
01800			LDAZ	DIS	;GET REBUF INDEX
01900			ANDI	300
02000			ROLA
02100			ROLA
02200			ROLA
02300			TAX
02400			LDAX	ROWTBL	;NLINES * 28
02500			ADCZ	CURVIS
02600			TAY
02700		NOTVIS:	STYZ	CURVIS
02800			RTS
02900	
03000		ROWTBL:	0
03100			CPL
03200			CPL*2
03300			CPL*3
03400	
03500		SHOCUR:	LDYZ	CURVIS
03600			BMI	NOSHO
03700			LDAY	REBUF0	;OR CURSOR INTO CHR
03800			EORI	100
03900			STAY	REBUF0
04000			LDAY	REBUF1
04100			EORI	100
04200			STAY	REBUF1
04300			LDAY	REBUF2
04400			EORI	100
04500			STAY	REBUF2
04600			LDAY	REBUF3
04700			EORI	100
04800			STAY	REBUF3
04900			LDAY	REBUF4
05000			EORI	100
05100			STAY	REBUF4
05200		NOSHO:	RTS
     

00100	; HOME CURSOR.
00200		HOME:	LDAI	0	;CURSOR ← WINDOW ← TOP
00300			STAZ	CUR
00400			STAZ	WINDOW
00500			STAZ	CURVIS
00600			LDAI	SD
00700			STAZ	CUR+1
00800			STAZ	WINDOW+1
00900			STAZ	UPFLG	;SET UPDATE FLAG
01000			RTS
01100	; <lf> SUBROUTINE
01200		LF:	LDAZ	CUR
01300			CLC
01400			ADCI	100	;CUR ← CUR + 64
01500			STAZ	CUR
01600			BCC	CTEOL
01700			INCZ	CUR+1
01800			LDAZ	CUR+1
01900			CMPI	ED
02000			BNE	CTEOL
02100			LDAI	SD	;WRAP AROUND
02200			STAZ	CUR+1
02300	; CLEAR TO END OF LINE.
02400		CTEOL:	LDAZ	CUR	
02500			ANDI	77
02600			EORI	77
02700			TAY		;Y ← # CHRS LEFT ON LINE
02800			LDAI	40	;<space>
02900		CLRL:	STAIY	CUR	;FILL CURSOR TO CURSOR + CPL
03000			DEY		;WITH SPACES
03100			BPL	CLRL
03200			RTS
03300	; <cr> SUBROUTINE
03400		CR:	LDAZ	CUR	;CUR ← CUR ∧ ¬77
03500			ANDI	300
03600			STAZ	CUR
03700			RTS
     

00100	; ASCII TABLE	BITS     7    6   5  4  3   2   1   0
00200	;	LOC	176000	CNTL SHFT S2 S1 S0 RL2 RL1 RL0
00300		LOC	176000
00400	CHRTBL:	
00500		 7   ↔	 7   ↔	 7   ↔	 7   ↔	 7   ↔	 7   ↔	 7   ↔	 7  ;CONTROL
00600		 7   ↔	 7   ↔	 7   ↔	 7   ↔	 7   ↔	 7   ↔	 7   ↔	 7
00700		 7   ↔	 7   ↔	 7   ↔	 7   ↔	 7   ↔	 7   ↔	 7   ↔	 7
00800		 7   ↔	 7   ↔	 7   ↔	 7   ↔	 7   ↔	 7   ↔	 7   ↔	 7
00900		 7   ↔	 7   ↔	 7   ↔	 7   ↔	 7   ↔	 7   ↔	 7   ↔	 7
01000		 7   ↔	 7   ↔	 7   ↔	 7   ↔	 7   ↔	 7   ↔	 7   ↔	 7
01100		 7   ↔	 7   ↔	 7   ↔	 7   ↔	 7   ↔	 7   ↔	 7   ↔	 7
01200		 7   ↔	 7   ↔	 7   ↔	 7   ↔	 7   ↔	 7   ↔	 7   ↔	 7
01300	
01400		 7   ↔	 7   ↔	 7   ↔	 7   ↔	 7   ↔	 7   ↔	 7   ↔	 7  ;CNTL SHFT
01500		 7   ↔	 7   ↔	 7   ↔	 7   ↔	 7   ↔	 7   ↔	 7   ↔	 7
01600		 7   ↔	 7   ↔	 7   ↔	 7   ↔	 7   ↔	 7   ↔	 7   ↔	 7
01700		 7   ↔	 7   ↔	 7   ↔	 7   ↔	 7   ↔	 7   ↔	 7   ↔	 7
01800		 7   ↔	 7   ↔	 7   ↔	 7   ↔	 7   ↔	 7   ↔	 7   ↔	 7
01900		 7   ↔	 7   ↔	 7   ↔	 7   ↔	 7   ↔	 7   ↔	 7   ↔	 7
02000		 7   ↔	 7   ↔	 7   ↔	 7   ↔	 7   ↔	 7   ↔	 7   ↔	 7
02100		 7   ↔	 7   ↔	 7   ↔	 7   ↔	 7   ↔	 7   ↔	 7   ↔	 7
02200	
02300		 7   ↔	"?"  ↔	 7   ↔	 7   ↔	 7   ↔	 7   ↔	"'"  ↔	13  ;SHIFT
02400		"+"  ↔	"("  ↔	 7   ↔	 7   ↔	 7   ↔	 7   ↔	42   ↔	26
02500		"-"  ↔	")"  ↔	 7   ↔	 7   ↔	 7   ↔	 7   ↔	"@"  ↔	27
02600		"*"  ↔	"["  ↔	 7   ↔	 7   ↔	 7   ↔	 7   ↔	"$"  ↔	" "
02700		"/"  ↔	"]"  ↔	 7   ↔	 7   ↔	 7   ↔	 7   ↔	":"  ↔	22
02800		"="  ↔	"%"  ↔	 7   ↔	 7   ↔	 7   ↔	 7   ↔	";"  ↔	12
02900		 7   ↔	 7   ↔	 7   ↔	 7   ↔	 7   ↔	 7   ↔	 7   ↔	 7
03000		 7   ↔	 7   ↔	 7   ↔	 7   ↔	 7   ↔	 7   ↔	 7   ↔	 7
03100	
03200		 7   ↔	"#"  ↔	"A"  ↔	"G"  ↔	"M"  ↔	"S"  ↔	"Y"  ↔	14
03300		"1"  ↔	"6"  ↔	"B"  ↔	"H"  ↔	"N"  ↔	"T"  ↔	"Z"  ↔	20
03400		"2"  ↔	"7"  ↔	"C"  ↔	"I"  ↔	"O"  ↔	"U"  ↔	"-"  ↔	21
03500		"3"  ↔	"8"  ↔	"D"  ↔	"J"  ↔	"P"  ↔	"V"  ↔	"!"  ↔	" "
03600		"4"  ↔	"9"  ↔	"E"  ↔	"K"  ↔	"Q"  ↔	"W"  ↔	"."  ↔	10
03700		"5"  ↔  "0"  ↔  "F"  ↔  "L"  ↔  "R"  ↔  "X"  ↔  ","  ↔  15
03800		 7   ↔	 7   ↔	 7   ↔	 7   ↔	 7   ↔	 7   ↔	 7   ↔	 7
03900		 7   ↔	 7   ↔	 7   ↔	 7   ↔	 7   ↔	 7   ↔	 7   ↔	 7
     

00100	;CHR GEN		⊗ = GRAPHICS
00200	;	0	1	2	3	4	5	6	7
00300	;  0/	 	⊗	⊗	⊗	⊗	⊗	⊗	 
00400	; 10/	 	 					 	⊗
00500	; 20/								
00600	; 30/	⊗	⊗	⊗	⊗	⊗	⊗	⊗	⊗
00700	; 40/	 	!	"	#	$	%	&	'
00800	; 50/	(	)	*	+	,	-	.	/
00900	; 60/	0	1	2	3	4	5	6	7
01000	; 70/	8	9	:	;	<	=	>	?
01100	;100/	@	A	B	C	D	E	F	G
01200	;110/	H	I	J	K	L	M	N	O
01300	;120/	P	Q	R	S	T	U	V	W
01400	;130/	X	Y	Z	[	\	]	↑	←
01500	;140/	 	a	b	c	d	e	f	g
01600	;150/	h	i	j	k	l	m	n	o
01700	;160/	p	q	r	s	t	u	v	w
01800	;170/	x	y	z	{	|	 	}	
01900	
02000		LOC 176400	;LOC 176400
02100	
02200	CGEN0:	000 ↔ 000 ↔ 000 ↔ 000 ↔ 010 ↔ 010 ↔ 000 ↔ 000
02300		000 ↔ 000 ↔ 000 ↔ 000 ↔ 000 ↔ 000 ↔ 000 ↔ 000
02400		000 ↔ 000 ↔ 000 ↔ 000 ↔ 000 ↔ 010 ↔ 000 ↔ 000
02500		010 ↔ 000 ↔ 010 ↔ 010 ↔ 010 ↔ 000 ↔ 010 ↔ 010
02600		000 ↔ 157 ↔ 003 ↔ 024 ↔ 056 ↔ 043 ↔ 060 ↔ 003
02700		034 ↔ 101 ↔ 044 ↔ 010 ↔ 100 ↔ 010 ↔ 140 ↔ 040
02800		076 ↔ 102 ↔ 102 ↔ 042 ↔ 010 ↔ 057 ↔ 060 ↔ 101
02900		066 ↔ 106 ↔ 146 ↔ 114 ↔ 010 ↔ 024 ↔ 101 ↔ 002
03000		164 ↔ 176 ↔ 177 ↔ 076 ↔ 177 ↔ 177 ↔ 177 ↔ 076
03100		177 ↔ 101 ↔ 040 ↔ 177 ↔ 177 ↔ 177 ↔ 177 ↔ 076
03200		177 ↔ 076 ↔ 177 ↔ 046 ↔ 001 ↔ 077 ↔ 037 ↔ 177
03300		143 ↔ 003 ↔ 141 ↔ 177 ↔ 002 ↔ 101 ↔ 004 ↔ 010
03400		000 ↔ 044 ↔ 177 ↔ 070 ↔ 060 ↔ 070 ↔ 010 ↔ 046
03500		177 ↔ 172 ↔ 040 ↔ 177 ↔ 101 ↔ 174 ↔ 174 ↔ 070
03600		177 ↔ 006 ↔ 174 ↔ 110 ↔ 004 ↔ 074 ↔ 034 ↔ 074
03700		104 ↔ 047 ↔ 104 ↔ 010 ↔ 177 ↔ 000 ↔ 101 ↔ 000
03800	
03900	CGEN1:	000 ↔ 000 ↔ 000 ↔ 000 ↔ 010 ↔ 010 ↔ 000 ↔ 000
04000		000 ↔ 000 ↔ 000 ↔ 000 ↔ 000 ↔ 000 ↔ 000 ↔ 000
04100		000 ↔ 000 ↔ 000 ↔ 000 ↔ 000 ↔ 010 ↔ 000 ↔ 000
04200		010 ↔ 000 ↔ 010 ↔ 010 ↔ 010 ↔ 000 ↔ 010 ↔ 010
04300		000 ↔ 157 ↔ 000 ↔ 177 ↔ 111 ↔ 023 ↔ 116 ↔ 000
04400		042 ↔ 042 ↔ 030 ↔ 010 ↔ 040 ↔ 010 ↔ 140 ↔ 020
04500		121 ↔ 177 ↔ 141 ↔ 101 ↔ 014 ↔ 111 ↔ 110 ↔ 041
04600		111 ↔ 051 ↔ 146 ↔ 054 ↔ 024 ↔ 024 ↔ 042 ↔ 001
04700		124 ↔ 011 ↔ 111 ↔ 101 ↔ 101 ↔ 111 ↔ 011 ↔ 101
04800		010 ↔ 177 ↔ 100 ↔ 010 ↔ 100 ↔ 002 ↔ 004 ↔ 101
04900		011 ↔ 101 ↔ 011 ↔ 111 ↔ 001 ↔ 100 ↔ 040 ↔ 040
05000		024 ↔ 004 ↔ 121 ↔ 101 ↔ 004 ↔ 101 ↔ 002 ↔ 034
05100		000 ↔ 124 ↔ 110 ↔ 104 ↔ 110 ↔ 124 ↔ 176 ↔ 111
05200		010 ↔ 000 ↔ 100 ↔ 040 ↔ 177 ↔ 004 ↔ 010 ↔ 104
05300		006 ↔ 011 ↔ 010 ↔ 124 ↔ 004 ↔ 100 ↔ 040 ↔ 100
05400		050 ↔ 110 ↔ 144 ↔ 066 ↔ 000 ↔ 000 ↔ 101 ↔ 000
     

00100	CGEN2:	000 ↔ 017 ↔ 177 ↔ 170 ↔ 010 ↔ 010 ↔ 010 ↔ 000
00200		000 ↔ 000 ↔ 000 ↔ 000 ↔ 000 ↔ 000 ↔ 000 ↔ 170
00300		000 ↔ 000 ↔ 000 ↔ 000 ↔ 000 ↔ 052 ↔ 000 ↔ 000
00400		170 ↔ 017 ↔ 017 ↔ 170 ↔ 017 ↔ 177 ↔ 177 ↔ 177
00500		000 ↔ 000 ↔ 003 ↔ 024 ↔ 177 ↔ 010 ↔ 121 ↔ 000
00600		101 ↔ 034 ↔ 030 ↔ 076 ↔ 000 ↔ 010 ↔ 000 ↔ 010
00700		111 ↔ 100 ↔ 121 ↔ 101 ↔ 012 ↔ 111 ↔ 114 ↔ 021
00800		111 ↔ 031 ↔ 000 ↔ 000 ↔ 042 ↔ 024 ↔ 024 ↔ 121
00900		164 ↔ 011 ↔ 111 ↔ 101 ↔ 101 ↔ 111 ↔ 011 ↔ 101
01000		010 ↔ 101 ↔ 100 ↔ 024 ↔ 100 ↔ 004 ↔ 010 ↔ 101
01100		011 ↔ 121 ↔ 031 ↔ 111 ↔ 177 ↔ 100 ↔ 100 ↔ 020
01200		010 ↔ 170 ↔ 111 ↔ 101 ↔ 010 ↔ 177 ↔ 177 ↔ 052
01300		000 ↔ 124 ↔ 110 ↔ 104 ↔ 110 ↔ 124 ↔ 011 ↔ 111
01400		010 ↔ 000 ↔ 100 ↔ 020 ↔ 100 ↔ 170 ↔ 004 ↔ 104
01500		011 ↔ 011 ↔ 004 ↔ 124 ↔ 077 ↔ 100 ↔ 100 ↔ 074
01600		020 ↔ 110 ↔ 124 ↔ 101 ↔ 000 ↔ 000 ↔ 076 ↔ 000
01700	
01800	CGEN3:	000 ↔ 000 ↔ 000 ↔ 000 ↔ 000 ↔ 010 ↔ 010 ↔ 000
01900		000 ↔ 000 ↔ 000 ↔ 000 ↔ 000 ↔ 000 ↔ 000 ↔ 010
02000		000 ↔ 000 ↔ 000 ↔ 000 ↔ 000 ↔ 010 ↔ 000 ↔ 000
02100		000 ↔ 010 ↔ 000 ↔ 010 ↔ 010 ↔ 010 ↔ 000 ↔ 010
02200		000 ↔ 000 ↔ 000 ↔ 177 ↔ 111 ↔ 144 ↔ 046 ↔ 000
02300		000 ↔ 000 ↔ 044 ↔ 010 ↔ 000 ↔ 010 ↔ 000 ↔ 004
02400		105 ↔ 000 ↔ 111 ↔ 111 ↔ 177 ↔ 111 ↔ 112 ↔ 011
02500		111 ↔ 011 ↔ 000 ↔ 000 ↔ 101 ↔ 024 ↔ 010 ↔ 011
02600		104 ↔ 011 ↔ 111 ↔ 101 ↔ 101 ↔ 111 ↔ 011 ↔ 111
02700		010 ↔ 000 ↔ 100 ↔ 042 ↔ 100 ↔ 002 ↔ 020 ↔ 101
02800		011 ↔ 041 ↔ 051 ↔ 111 ↔ 001 ↔ 100 ↔ 040 ↔ 040
02900		024 ↔ 004 ↔ 105 ↔ 000 ↔ 020 ↔ 000 ↔ 002 ↔ 010
03000		000 ↔ 124 ↔ 110 ↔ 104 ↔ 110 ↔ 124 ↔ 011 ↔ 106
03100		010 ↔ 000 ↔ 075 ↔ 050 ↔ 000 ↔ 004 ↔ 004 ↔ 104
03200		011 ↔ 006 ↔ 004 ↔ 124 ↔ 104 ↔ 100 ↔ 040 ↔ 100
03300		050 ↔ 104 ↔ 114 ↔ 101 ↔ 000 ↔ 000 ↔ 010 ↔ 000
03400	
03500	CGEN4:	000 ↔ 000 ↔ 000 ↔ 000 ↔ 000 ↔ 010 ↔ 010 ↔ 000
03600		000 ↔ 000 ↔ 000 ↔ 000 ↔ 000 ↔ 000 ↔ 000 ↔ 010
03700		000 ↔ 000 ↔ 000 ↔ 000 ↔ 000 ↔ 010 ↔ 000 ↔ 000
03800		000 ↔ 010 ↔ 000 ↔ 010 ↔ 010 ↔ 010 ↔ 000 ↔ 010
03900		000 ↔ 000 ↔ 000 ↔ 024 ↔ 062 ↔ 142 ↔ 100 ↔ 000
04000		000 ↔ 000 ↔ 000 ↔ 010 ↔ 000 ↔ 010 ↔ 000 ↔ 002
04100		076 ↔ 000 ↔ 106 ↔ 066 ↔ 010 ↔ 061 ↔ 061 ↔ 007
04200		066 ↔ 006 ↔ 000 ↔ 000 ↔ 000 ↔ 024 ↔ 000 ↔ 006
04300		174 ↔ 176 ↔ 066 ↔ 042 ↔ 076 ↔ 101 ↔ 001 ↔ 072
04400		177 ↔ 000 ↔ 077 ↔ 101 ↔ 100 ↔ 177 ↔ 177 ↔ 076
04500		006 ↔ 136 ↔ 106 ↔ 062 ↔ 001 ↔ 077 ↔ 037 ↔ 177
04600		143 ↔ 003 ↔ 103 ↔ 000 ↔ 040 ↔ 000 ↔ 004 ↔ 010
04700		000 ↔ 170 ↔ 060 ↔ 104 ↔ 177 ↔ 130 ↔ 002 ↔ 077
04800		160 ↔ 000 ↔ 000 ↔ 104 ↔ 000 ↔ 170 ↔ 170 ↔ 070
04900		006 ↔ 177 ↔ 010 ↔ 044 ↔ 104 ↔ 074 ↔ 034 ↔ 074
05000		104 ↔ 077 ↔ 104 ↔ 000 ↔ 000 ↔ 000 ↔ 000 ↔ 000
05100	
05200	; INTER VECTS
05300		LOC 177772	;LOC 177772
05400		NMIV:	KBINT∧377	;NMIV:	ABSO KBINT
05500			371
05600		RSTV:	0		;RSTV:	ABSO RSTA
05700			370
05800		IRQV:	RSINT∧377	;IRQV:	ABSO RSINT
05900			371
06000		END